"""
@name : 01函数式编程
@author : wenyao
@projectname: yttljcode
"""
#把函数作为参数传入，这样子的函数称为高阶函数
# def func(animal,f):
#     f(animal)
# def func1(animal):
#     print(f"this is {animal}")
#
# func("dog", func1)

#########常用的高阶函数###########
####map
#映射
#map 第一参数传入一个函数，第二个参数传入一个可迭代对象
#通常情况下第一个参数传入的函数，必须接收一个参数
# def func(item):
#     return item*item
# a = [1,2,3,4,5,6]
# #result = map(func, a)
# result = map(lambda item:item*item,a)
# print(list(result))
#
# #保留两位小数
# lst = [1.342567, 3.5463564, 2.45645]
# print(list(map(lambda x:float('%.2f'%x),lst)))
# #转换绝对值
# lst2 = [-1,-10,2,3,1,-4]
# print(list(map(lambda x:abs(x),lst2)))

#函数可以接收多个参数，接收两个参数那map函数就需要传入两个可迭代对象
#输出的结果个数以迭代次数少的对象为准
# result = map(lambda x,y:x+y,lst,lst2)
# print(list(result))
#
# lst = ["cmcc","cucc","教育网","cctv","ctcc","cmcc","cucc"]
# dict1 = {
#     "cmcc":"中国移动",
#     "cucc":'中国联通',
#     "ctcc":'中国电信'
# }
# print(list(map(lambda x:dict1.get(x,x),lst)))
# #  有列表[1,2,3,4,5]，将所有元素转换成str:['1','2','3','4','5'] 
# lst=[1,2,3,4,5]
# print(list(map(lambda x:str(x),lst)))
# # 有列表字符串'span'，将各字符转换成对应的ascii码的列表[115, 112, 97, 109]
# str1='span'
# print(list(map(lambda x:ord(x),str1)))

# dict1 = {"a":1,"b":2}
# print(dict1.get("a",0))
# print(dict1.get("c","c"))
# print(dict1.get("d"))
# print(dict1["e"])


############filter
#过滤
#保留奇数
#filter过滤执行的函数返回True或False 为True就留下相应的值 为False就删除
# lst = [1,2,3,4,5,6,7]
# result = filter(lambda x: x%2 == 1,lst)
# print(list(result))

#删掉列表中为假的以及全是空白的元素
# lst = [1,0,2,0.0,(),"","abc","   "]
# print(list(filter(lambda x:x and str(x).strip(),lst)))

#返回100以内的回数
#从左至右从右至左都一样 5，6， 55
# print(list(filter(lambda x: str(x) == str(x)[::-1],range(1,101))))
#print(list(filter(lambda x: x%11 == 0,range(1,101))))

#返回100以内开平方根是整数的数 比如：4 开平方 -- 2
# import math
# print(list(filter(lambda x:math.sqrt(x) in range(1,11),range(1,101))))

############reduce
#reduce的函数参数 接收两个参数
#第一次 1，2传给 x,y  得到3
#第二次 3，3 传给x,y  得到6
#第三次 6，4 传给x，y  得到10
# from functools import reduce
# lst = [1,2,3,4,5]
# print(reduce(lambda x,y: x+y,lst))

#从键盘接收一个整型数，在python中转化为int类型，不适用int()函数
#自己实现int函数

# dict1 = {"1":1,"2":2,"3":3,"4":4}
# num = input("请输入一个数:")
# if num.isdigit():
#     if len(num) >2:
#         ret = reduce(lambda x,y:dict1.get(x,x)*10 + dict1.get(y),num)
#     else:
#         ret = dict1.get(num)
#     print(type(ret))


# lst = [-1,4,2,8,3]
# lst.sort(reverse=True)
# print(lst)
########sorted
#根据key所指定的函数返回值来进行排序
# a = ["a1bc","a2","d11","cab","eaa","eabcd","bcdefg"]
# print(sorted(a, key=len))

# b = [-5,6,-2,1,4]
# print(sorted(b, key = abs))

#布尔类型排序
# a = [1, True, 0 ,False, "x" =="y", 3 %2 == 0]
# print(sorted(a))

#列表里包元组
# a = [(True,2,1),(False,2,1),(1,0,1),(1,0,-1)]
# print(sorted(a))


